package difed.restaurante.db;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import difed.restaurante.entidades.Poblacion;
import difed.restaurante.entidades.Provincia;
import difed.restaurante.entidades.RestCheck;
import difed.restaurante.entidades.Restaurante;
import difed.restaurante.entidades.Tipo;

public class ProveedorBDImpl implements ProveedorBD {

    private DbRestaurant dbRestaurant;
    private static ProveedorBDImpl db;
    
    
    private String comillaSimple(String nombre){
        
        String nombreComilla=nombre;
        
        if (nombreComilla.indexOf("'")>=0){
            nombreComilla=nombreComilla.replace("'", "''");
        }
        
        return nombreComilla;
    }
    
    
    @SuppressWarnings("static-access")
    String[] campos = new String[] { dbRestaurant.COL_ID,
            dbRestaurant.COL_NOMBRE, dbRestaurant.COL_DIRECCION,
            dbRestaurant.COL_TELEFONO1, dbRestaurant.COL_TELEFONO2,
            dbRestaurant.COL_POBLACION, dbRestaurant.COL_PROVINCIA,
            dbRestaurant.COL_TIPO, dbRestaurant.COL_SUGERENCIAS, dbRestaurant.COL_NOTAS };

    private ProveedorBDImpl(Context context) {
        dbRestaurant = new DbRestaurant(context);
        dbRestaurant.getWritableDatabase();
    }

    public static ProveedorBD getProveedor(Context context) {
        if (db == null) {
            db = new ProveedorBDImpl(context);
        }
        return db;
    }

    @SuppressWarnings("static-access")
    @Override
    public int eliminarRestaurante(long id) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        return db.delete(dbRestaurant.TABLA_RESTAURANTES, dbRestaurant.COL_ID
                + " = ?", new String[] { Long.toString(id) });
    }

    @SuppressWarnings("static-access")
    @Override
    public void eliminarRestaurante(String restauranteModificar) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        db.delete(dbRestaurant.TABLA_RESTAURANTES, dbRestaurant.COL_NOMBRE.trim()
                + " = ?", new String[] { restauranteModificar });

    }

    @SuppressWarnings("static-access")
    @Override
    public Restaurante getRestaurante(long id) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        Cursor c = db.query(dbRestaurant.TABLA_RESTAURANTES, campos,
                dbRestaurant.COL_ID + " = ? ",
                new String[] { Long.toString(id) }, null, null, null);

        Restaurante restaurante = new Restaurante();
        if (c != null) {
            if (c.moveToNext()) {
                restaurante.setId(id);
                restaurante.setNombre(c.getString(1));
                restaurante.setDireccion(c.getString(2));
                restaurante.setTelefono1(c.getString(3));
                restaurante.setTelefono2(c.getString(4));
                restaurante.setId_poblacion(c.getString(5));
                restaurante.setId_provincia(c.getString(6));
                restaurante.setId_tipo(c.getString(7));
                restaurante.setNotas(c.getString(8));
            }
        }
        closeResource(c);
        return restaurante;

    }

    @SuppressWarnings("static-access")
    @Override
    public Restaurante getRestaurante(String nombre) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        String where = "(" + DbRestaurant.COL_NOMBRE.trim() + " = '" + comillaSimple(nombre.trim()) + "')";

        Cursor c = db.query(dbRestaurant.TABLA_RESTAURANTES, campos, where,
                null, null, null, null);

        Restaurante restaurante = new Restaurante();
        if (c != null) {
            if (c.moveToNext()) {
                restaurante.setId(c.getLong(0));
                restaurante.setNombre(c.getString(1));
                restaurante.setDireccion(c.getString(2));
                restaurante.setTelefono1(c.getString(3));
                restaurante.setTelefono2(c.getString(4));
                restaurante.setId_poblacion(c.getString(5));
                restaurante.setId_provincia(c.getString(6));
                restaurante.setId_tipo(c.getString(7));
                restaurante.setSugerencias(c.getString(8));
                restaurante.setNotas(c.getString(9));
            }
        }
        closeResource(c);
        return restaurante;
    }

    @SuppressWarnings("static-access")
    @Override
    public List<Restaurante> getRestaurantes(String cadena) {

        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        String where = "";
        if (cadena != null && cadena.trim().length() > 0) {
            where = "(" + DbRestaurant.COL_NOMBRE.toUpperCase().trim() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_DIRECCION.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_POBLACION.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_PROVINCIA.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_TIPO.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_SUGERENCIAS.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_NOTAS.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%')";

            /*
             * where = "(" + DbRestaurant.COL_NOMBRE.toUpperCase() + " LIKE '%"
             * + cadena.toUpperCase() + "%') OR (" +
             * dbRestaurant.COL_PROVINCIA.toUpperCase() + " LIKE '%" +
             * cadena.toUpperCase() + "%')";
             */
        }
        Cursor c = db.query(DbRestaurant.TABLA_RESTAURANTES, campos, where,
                null, null, null, dbRestaurant.COL_NOMBRE.trim());

        List<Restaurante> restaurantes = new ArrayList<Restaurante>();
        if (c != null) {
            Restaurante restaurante;
            while (c.moveToNext()) {
                restaurante = new Restaurante();
                restaurante.setId(c.getLong(0));
                restaurante.setNombre(c.getString(1));
                restaurante.setDireccion(c.getString(2));
                restaurante.setTelefono1(c.getString(3));
                restaurante.setTelefono2(c.getString(4));
                restaurante.setId_poblacion(c.getString(5));
                restaurante.setId_provincia(c.getString(6));
                restaurante.setId_tipo(c.getString(7));
                restaurante.setSugerencias(c.getString(8));
                restaurante.setNotas(c.getString(9));
                restaurantes.add(restaurante);
            }
        }
        closeResource(c);
        return restaurantes;

    }

    private static void closeResource(Cursor cursor) {
        if (cursor != null) {
            cursor.close();
        }
    }

    @SuppressWarnings("static-access")
    @Override
    /**
     * Devuelve el nuevo ID
     */
    public long guardarRestaurante(Restaurante restaurante) {

        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(dbRestaurant.COL_NOMBRE, restaurante.getNombre().trim());
        values.put(dbRestaurant.COL_DIRECCION, restaurante.getDireccion());
        values.put(dbRestaurant.COL_TELEFONO1, restaurante.getTelefono1());
        values.put(dbRestaurant.COL_TELEFONO2, restaurante.getTelefono2());
        values.put(dbRestaurant.COL_POBLACION, restaurante.getId_poblacion());
        values.put(dbRestaurant.COL_PROVINCIA, restaurante.getId_provincia());
        values.put(dbRestaurant.COL_TIPO, restaurante.getId_tipo());
        values.put(dbRestaurant.COL_SUGERENCIAS, restaurante.getSugerencias());
        values.put(dbRestaurant.COL_NOTAS, restaurante.getNotas());
        long id = db.insert(dbRestaurant.TABLA_RESTAURANTES, null, values);

        // Guardamos la provincia si procede
        if (restaurante.getId_provincia() != null) {
            guardarProvincia(restaurante.getId_provincia());
        }

        // Guardamos la poblacion si procede
        if (restaurante.getId_poblacion() != null) {
            guardarPoblacion(restaurante.getId_poblacion());
        }
        // Guardamos el tipo si procede
        if (restaurante.getId_tipo() != null) {
            guardarTipo(restaurante.getId_tipo());
        }

        return id;
    }

    @SuppressWarnings("static-access")
    @Override
    public void modificarRestaurante(Restaurante restaurante) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(dbRestaurant.COL_NOMBRE, restaurante.getNombre().trim());
        values.put(dbRestaurant.COL_DIRECCION, restaurante.getDireccion());
        values.put(dbRestaurant.COL_TELEFONO1, restaurante.getTelefono1());
        values.put(dbRestaurant.COL_TELEFONO2, restaurante.getTelefono2());
        values.put(dbRestaurant.COL_POBLACION, restaurante.getId_poblacion());
        values.put(dbRestaurant.COL_PROVINCIA, restaurante.getId_provincia());
        values.put(dbRestaurant.COL_TIPO, restaurante.getId_tipo());
        values.put(dbRestaurant.COL_SUGERENCIAS, restaurante.getSugerencias());
        values.put(dbRestaurant.COL_NOTAS, restaurante.getNotas());

        db.update(dbRestaurant.TABLA_RESTAURANTES, values, dbRestaurant.COL_ID
                + " = ?", new String[] { Long.toString(restaurante.getId()) });

    }

    @Override
    public List<Restaurante> lRestaurantes() {

        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        Cursor c = db.query(DbRestaurant.TABLA_RESTAURANTES, campos, null,
                null, null, null, null);

        List<Restaurante> restaurantes = new ArrayList<Restaurante>();
        if (c != null) {
            Restaurante restaurante;
            while (c.moveToNext()) {
                restaurante = new Restaurante();
                restaurante.setId(c.getLong(0));
                restaurante.setNombre(c.getString(1));
                restaurante.setDireccion(c.getString(2));
                restaurante.setTelefono1(c.getString(3));
                restaurante.setTelefono2(c.getString(4));
                restaurante.setId_poblacion(c.getString(5));
                restaurante.setId_provincia(c.getString(6));
                restaurante.setId_tipo(c.getString(7));
                restaurante.setSugerencias(c.getString(8));
                restaurante.setNotas(c.getString(9));
                restaurantes.add(restaurante);
            }
        }
        closeResource(c);
        return restaurantes;

    }

    @SuppressWarnings("static-access")
    @Override
    public List<Poblacion> getPoblacion() {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        Cursor c = db.query(DbRestaurant.TABLA_POBLACION,
                new String[] { DbRestaurant.COL_POBLACION }, null, null, null,
                null, dbRestaurant.COL_POBLACION);

        List<Poblacion> lPoblacion = new ArrayList<Poblacion>();
        if (c != null) {
            Poblacion poblacion;
            while (c.moveToNext()) {
                poblacion = new Poblacion();
                poblacion.setPoblacion(c.getString(0));
                lPoblacion.add(poblacion);
            }
        }
        closeResource(c);
        return lPoblacion;
    }

    @SuppressWarnings("static-access")
    @Override
    public Poblacion getPoblacion(int id) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        Cursor c = db.query(dbRestaurant.TABLA_POBLACION,
                new String[] { DbRestaurant.COL_POBLACION },
                dbRestaurant.COL_ID + " = ? ", new String[] { Integer
                        .toString(id) }, null, null, null);

        Poblacion poblacion = new Poblacion();
        if (c != null) {
            if (c.moveToNext()) {
                poblacion.setPoblacion(c.getString(0));
            }
        }
        closeResource(c);
        return poblacion;
    }

    @SuppressWarnings("static-access")
    @Override
    public Provincia getProvincia(int id) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        Cursor c = db.query(dbRestaurant.TABLA_PROVINCIA,
                new String[] { DbRestaurant.COL_PROVINCIA },
                dbRestaurant.COL_ID + " = ? ", new String[] { Integer
                        .toString(id) }, null, null, null);

        Provincia provincia = new Provincia();
        if (c != null) {
            if (c.moveToNext()){
                provincia.setProvincia(c.getString(0));
            }
        }
        closeResource(c);
        return provincia;
    }

    @SuppressWarnings("static-access")
    @Override
    public List<Provincia> getProvincias() {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        Cursor c = db.query(DbRestaurant.TABLA_PROVINCIA,
                new String[] { DbRestaurant.COL_PROVINCIA }, null, null, null,
                null, dbRestaurant.COL_PROVINCIA);

        List<Provincia> lProvincia = new ArrayList<Provincia>();
        if (c != null) {
            Provincia provincia;
            while (c.moveToNext()) {
                provincia = new Provincia();
                provincia.setProvincia(c.getString(0));
                lProvincia.add(provincia);
            }
        }
        closeResource(c);
        return lProvincia;
    }

    @SuppressWarnings("static-access")
    @Override
    public Tipo getTipo(int id) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        Cursor c = db.query(dbRestaurant.TABLA_TIPO,
                new String[] { DbRestaurant.COL_TIPO }, dbRestaurant.COL_ID
                        + " = ? ", new String[] { Integer.toString(id) }, null,
                null, null);

        Tipo tipo = new Tipo();
        if (c != null) {
            if (c.moveToNext()){
                tipo.setTipo(c.getString(0));
            }
        }
        closeResource(c);
        return tipo;
    }

    @SuppressWarnings("static-access")
    @Override
    public List<Tipo> getTipos() {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        Cursor c = db.query(DbRestaurant.TABLA_TIPO,
                new String[] { DbRestaurant.COL_TIPO }, null, null, null, null,
                dbRestaurant.COL_TIPO);

        List<Tipo> lTipo = new ArrayList<Tipo>();
        if (c != null) {
            Tipo tipo;
            while (c.moveToNext()) {
                tipo = new Tipo();
                tipo.setTipo(c.getString(0));
                lTipo.add(tipo);
            }
        }
        closeResource(c);
        return lTipo;
    }

    @SuppressWarnings("static-access")
    @Override
    public long guardarPoblacion(String poblacion) {
        if (!(getExistePoblacion(poblacion))) {
            SQLiteDatabase db = dbRestaurant.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(dbRestaurant.COL_POBLACION, poblacion);
            long id = db.insert(dbRestaurant.TABLA_POBLACION, null, values);
            return id;
        }
        return 0;
    }

    @SuppressWarnings("static-access")
    @Override
    public long guardarProvincia(String provincia) {
        if (!(getExisteProvincia(provincia))) {
            SQLiteDatabase db = dbRestaurant.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(dbRestaurant.COL_PROVINCIA, provincia);
            long id = db.insert(dbRestaurant.TABLA_PROVINCIA, null, values);
            return id;
        }
        return 0;
    }

    @SuppressWarnings("static-access")
    @Override
    public long guardarTipo(String tipo) {
        if (!(getExisteTipo(tipo))) {
            SQLiteDatabase db = dbRestaurant.getWritableDatabase();
            ContentValues values = new ContentValues();
            values.put(dbRestaurant.COL_TIPO, tipo);
            long id = db.insert(dbRestaurant.TABLA_TIPO, null, values);
            return id;
        }
        return 0;
    }

    @SuppressWarnings("static-access")
    @Override
    public boolean getExisteProvincia(String provincia) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        String where = " UPPER(" + dbRestaurant.COL_PROVINCIA + ") ='"
                + comillaSimple(provincia.toUpperCase().trim()) + "'";

        Cursor c = db.query(dbRestaurant.TABLA_PROVINCIA,
                new String[] { DbRestaurant.COL_ID }, where, null, null, null,
                null);
        boolean i = false;
        if (c.moveToFirst()) {
            i = true;
        }
        c.close();
        return i;
    }

    @SuppressWarnings("static-access")
    @Override
    public boolean getExistePoblacion(String poblacion) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        String where = " UPPER(" + dbRestaurant.COL_POBLACION + ") ='"
                + comillaSimple(poblacion.toUpperCase().trim()) + "'";

        Cursor c = db.query(dbRestaurant.TABLA_POBLACION,
                new String[] { DbRestaurant.COL_ID }, where, null, null, null,
                null);
        boolean i = false;
        if (c.moveToFirst()) {
            i = true;
        }
        c.close();
        return i;
    }

    @SuppressWarnings("static-access")
    @Override
    public boolean getExisteTipo(String tipo) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        String where = " UPPER(" + dbRestaurant.COL_TIPO + ") ='"
                + comillaSimple(tipo.toUpperCase().trim()) + "'";

        Cursor c = db.query(dbRestaurant.TABLA_TIPO,
                new String[] { DbRestaurant.COL_ID }, where, null, null, null,
                null);
        boolean i = false;
        if (c.moveToFirst()) {
            i = true;
        }
        c.close();
        return i;
    }

    @SuppressWarnings("static-access")
    @Override
    public List<Restaurante> filtrarRestaurantes(String filtro) {

        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        String where = "";
       

        Cursor c = db.query(DbRestaurant.TABLA_RESTAURANTES, campos, where,
                null, null, null, dbRestaurant.COL_NOMBRE.trim());

        List<Restaurante> restaurantes = new ArrayList<Restaurante>();
        if (c != null) {
            Restaurante restaurante;
            while (c.moveToNext()) {
                restaurante = new Restaurante();
                restaurante.setId(c.getLong(0));
                restaurante.setNombre(c.getString(1));
                restaurante.setDireccion(c.getString(2));
                restaurante.setTelefono1(c.getString(3));
                restaurante.setTelefono2(c.getString(4));
                restaurante.setId_poblacion(c.getString(5));
                restaurante.setId_provincia(c.getString(6));
                restaurante.setId_tipo(c.getString(7));
                restaurante.setSugerencias(c.getString(8));
                restaurante.setNotas(c.getString(9));
                restaurantes.add(restaurante);
            }
        }
        closeResource(c);
        return restaurantes;

    }

    @SuppressWarnings("static-access")
    @Override
    public int eliminarFiltro() {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        return db.delete(dbRestaurant.TABLA_FILTRO, null, null);
    }

    @SuppressWarnings("static-access")
    @Override
    public List<Restaurante> getRestaurantesFiltro(String cadena) {

        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        String where = "";
        if (cadena != null && cadena.trim().length() > 0) {
            where = "(" + DbRestaurant.COL_NOMBRE.toUpperCase().trim() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_DIRECCION.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_POBLACION.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_PROVINCIA.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_TIPO.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_SUGERENCIAS.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%') OR ("
                    + dbRestaurant.COL_NOTAS.toUpperCase() + " LIKE '%"
                    + comillaSimple(cadena.toUpperCase()) + "%')";
        }
        Cursor c = db.query(DbRestaurant.TABLA_FILTRO, campos, where, null,
                null, null, dbRestaurant.COL_NOMBRE.trim());

        List<Restaurante> restaurantes = new ArrayList<Restaurante>();
        if (c != null) {
            Restaurante restaurante;
            while (c.moveToNext()) {
                restaurante = new Restaurante();
                restaurante.setId(c.getLong(0));
                restaurante.setNombre(c.getString(1));
                restaurante.setDireccion(c.getString(2));
                restaurante.setTelefono1(c.getString(3));
                restaurante.setTelefono2(c.getString(4));
                restaurante.setId_poblacion(c.getString(5));
                restaurante.setId_provincia(c.getString(6));
                restaurante.setId_tipo(c.getString(7));
                restaurante.setSugerencias(c.getString(8));
                restaurante.setNotas(c.getString(9));
                restaurantes.add(restaurante);
            }
        }
        closeResource(c);
        return restaurantes;
    }

    @SuppressWarnings("static-access")
    @Override
    public void guardarFiltro(String filtro) {

        List<Restaurante> lrestaurantes = new ArrayList<Restaurante>();

        lrestaurantes = getRestaurantes(filtro);

        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        for (Restaurante restaurante : lrestaurantes) {
            ContentValues values = new ContentValues();
            values.put(dbRestaurant.COL_NOMBRE, restaurante.getNombre().trim());
            values.put(dbRestaurant.COL_DIRECCION, restaurante.getDireccion());
            values.put(dbRestaurant.COL_TELEFONO1, restaurante.getTelefono1());
            values.put(dbRestaurant.COL_TELEFONO2, restaurante.getTelefono2());
            values.put(dbRestaurant.COL_POBLACION, restaurante
                    .getId_poblacion());
            values.put(dbRestaurant.COL_PROVINCIA, restaurante
                    .getId_provincia());
            values.put(dbRestaurant.COL_TIPO, restaurante.getId_tipo());
            values.put(dbRestaurant.COL_SUGERENCIAS, restaurante.getSugerencias());
            values.put(dbRestaurant.COL_NOTAS, restaurante.getNotas());
            @SuppressWarnings("unused")
            long id = db.insert(dbRestaurant.TABLA_FILTRO, null, values);
            values = null;
        }
    }

    @SuppressWarnings("static-access")
    @Override
    public List<RestCheck> lRestaurantesCheck() {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();
        
        Cursor c = db.query(DbRestaurant.TABLA_RESTAURANTES, campos, null,
                null, null, null, dbRestaurant.COL_NOMBRE.trim());

        List<RestCheck> lrestaurantes = new ArrayList<RestCheck>();
        if (c != null) {
            RestCheck restaurante;
            while (c.moveToNext()) {
                restaurante = new RestCheck(c.getString(1));
                lrestaurantes.add(restaurante);
            }
        }
        closeResource(c);
        return lrestaurantes;
        
        
    }

    @SuppressWarnings("static-access")
    @Override
    public long getExisteRestaurante(String nombre) {
        SQLiteDatabase db = dbRestaurant.getWritableDatabase();

        String where = " UPPER(" + dbRestaurant.COL_NOMBRE.trim() + ") ='"
                + comillaSimple(nombre.toUpperCase()) + "'";

        Cursor c = db.query(dbRestaurant.TABLA_RESTAURANTES,
                new String[] { DbRestaurant.COL_ID }, where, null, null, null,null
                );
        long i = 0;
        if (c.moveToFirst()) {
            i = c.getLong(0);
        }
        c.close();
        return i;
        
    }

}
